{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "d4co3_i434-C"
   },
   "source": [
    "##### Copyright 2020 The Cirq Developers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "cellView": "form",
    "id": "2u6HZdKb4RXV"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
    "# you may not use this file except in compliance with the License.\n",
    "# You may obtain a copy of the License at\n",
    "#\n",
    "# https://www.apache.org/licenses/LICENSE-2.0\n",
    "#\n",
    "# Unless required by applicable law or agreed to in writing, software\n",
    "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    "# See the License for the specific language governing permissions and\n",
    "# limitations under the License."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Y2uPCv_O43wN"
   },
   "source": [
    "# Notebook template"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "8w2UKUVC4rs6"
   },
   "source": [
    "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://www.example.org/cirq/tutorials/google/colab\"><img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />View on QuantumLib</a>\n",
    "  </td>\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/quantumlib/Cirq/blob/master/docs/tutorials/google/colab.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",
    "  </td>\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://github.com/quantumlib/Cirq/blob/master/docs/tutorials/google/colab.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />View source on GitHub</a>\n",
    "  </td>\n",
    "  <td>\n",
    "    <a href=\"https://storage.googleapis.com/tensorflow_docs/Cirq/docs/tutorials/google/colab.ipynb\"><img src=\"https://www.tensorflow.org/images/download_logo_32px.png\" />Download notebook</a>\n",
    "  </td>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "id": "bd9529db1c0b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    import cirq\n",
    "except ImportError:\n",
    "    print(\"installing cirq...\")\n",
    "    !pip install --quiet cirq\n",
    "    print(\"installed cirq.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "iBW4Iix64cFn"
   },
   "source": [
    "## Make a copy of this template\n",
    "\n",
    "You will need to have access to Quantum Computing Service before running this colab.\n",
    "\n",
    "This notebook can serve as a starter kit for you to run programs on Google's quantum hardware.  You can download it using the directions below, open it in colab (or Jupyter), and modify it to begin your experiments."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "6q5lpwgW5TrE"
   },
   "source": [
    "## How to download iPython notebooks from GitHub\n",
    "\n",
    "You can retrieve iPython notebooks in the Cirq repository by\n",
    "going to the [docs/ directory](https://github.com/quantumlib/Cirq/tree/master/docs).  For instance, this Colab template is found [here](https://github.com/quantumlib/Cirq/blob/master/docs/tutorials/google/colab.ipynb). Select the file that you would like to download and then click the *Raw* button in the upper-right part of the window:\n",
    "\n",
    "<img src=\"https://raw.githubusercontent.com/quantumlib/Cirq/master/docs/images/colab_github.png\" alt=\"GitHub UI button to view raw file\">\n",
    "\n",
    "This will show the entire file contents.  Right-click and select *Save as* to save this file to your computer.  Make sure to save to a file with a `.ipynb` extension (you may need to select *All files* from the format dropdown instead of *text*). You can also get to this Colab's [raw content directly](https://raw.githubusercontent.com/quantumlib/Cirq/master/docs/tutorials/google/colab.ipynb)\n",
    "\n",
    "You can also retrieve the entire Cirq repository by running the following command in a terminal that has `git` installed:\n",
    "\n",
    "```\n",
    "git checkout https://github.com/quantumlib/Cirq.git\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "czt1fSEHooF9"
   },
   "source": [
    "## How to open Google Colab\n",
    "\n",
    "You can open a new Colab notebook from your Google Drive window or by visiting the [Colab site](https://colab.research.google.com/notebooks/intro.ipynb).  From the Colaboratory site, you can use the menu to upload an iPython notebook:\n",
    "\n",
    "<img src=\"https://raw.githubusercontent.com/quantumlib/Cirq/master/docs/images/colab_upload.png\" alt=\"Google Colab's upload notebook entry in File menu.\">\n",
    "\n",
    "This will upload the ipynb file that you downloaded before.  You can now run all the commands, modify it to suit your goals, and share it with others.\n",
    "\n",
    "### More Documentation Links\n",
    "\n",
    "* [Quantum Engine concepts](../../google/concepts.md)\n",
    "* [Quantum Engine documentation](../../google/engine.md)\n",
    "* [Cirq documentation](https://cirq.readthedocs.io)\n",
    "* [Colab documentation](https://colab.research.google.com/notebooks/welcome.ipynb)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Bip6ZAIQ6min"
   },
   "source": [
    "## Authenticate and install Cirq\n",
    "\n",
    "For details of authentication and installation, please see [go/quantum-engine-quickstart](http://go/quantum-engine-quickstart). \n",
    "\n",
    "Note:  The below code will install the latest stable release of cirq.  If you need the latest and greatest features and don't mind if a few things aren't quite working correctly, you can install the pre-release version of `cirq` using `pip install --pre cirq` instead of `pip install cirq` to get the most up-to-date features of cirq.\n",
    "\n",
    "1. Enter the Cloud project ID you'd like to use in the `project_id` field.\n",
    "2. Then run the cell below (and go through the auth flow for access to the project id you entered).\n",
    "\n",
    "<img src=\"https://raw.githubusercontent.com/quantumlib/Cirq/master/docs/images/run-code-block.png\" alt=\"Quantum Engine console\">"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "cellView": "both",
    "id": "wfHdoHW67EGh"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Notebook is not executed with Colab, assuming Application Default Credentials are setup.\n",
      "Successful authentication to Google Cloud.\n"
     ]
    }
   ],
   "source": [
    "# The Google Cloud Project id to use.\n",
    "project_id = '' #@param {type:\"string\"}\n",
    "\n",
    "if project_id == '':\n",
    "    import os \n",
    "    if 'GOOGLE_CLOUD_PROJECT' not in os.environ:\n",
    "        raise Exception(\"Please setup project_id in this cell or set the `GOOGLE_CLOUD_PROJECT` env var to your project id.\")\n",
    "    project_id = os.environ['GOOGLE_CLOUD_PROJECT']\n",
    "else: \n",
    "    os.environ['GOOGLE_CLOUD_PROJECT'] = project_id\n",
    "\n",
    "def authenticate_user():\n",
    "  \"\"\"Runs the user through the Colab OAuth process.\n",
    "  \n",
    "  Checks for Google Application Default Credentials and runs interactive login \n",
    "  if the notebook is executed in Colab. In case the notebook is executed in Jupyter notebook\n",
    "  or other IPython runtimes, no interactive login is provided, it is assumed that the \n",
    "  `GOOGLE_APPLICATION_CREDENTIALS` env var is set or `gcloud auth application-default login`\n",
    "  was executed already.\n",
    "  \n",
    "  For more information on using Application Default Credentials see \n",
    "  https://cloud.google.com/docs/authentication/production\n",
    "  \"\"\"\n",
    "  in_colab = False\n",
    "  try:\n",
    "     from IPython import get_ipython\n",
    "     in_colab = 'google.colab' in str(get_ipython())\n",
    "  except: \n",
    "     # Notebook is not executed within IPython. Assuming external authentication.\n",
    "     return \n",
    "\n",
    "  if in_colab: \n",
    "      from google.colab import auth      \n",
    "      print(\"Getting OAuth2 credentials.\")\n",
    "      print(\"Press enter after entering the verification code.\")\n",
    "      auth.authenticate_user(clear_output=False)\n",
    "      print(\"Authentication complete.\")\n",
    "  else: \n",
    "      print(\"Notebook is not executed with Colab, assuming Application Default Credentials are setup.\") \n",
    "\n",
    "authenticate_user()\n",
    "\n",
    "print(\"Successful authentication to Google Cloud.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "5mwzenpB8FYi"
   },
   "source": [
    "## Create an Engine variable\n",
    "\n",
    "The following creates an engine variable which can be used to run programs under the project ID you entered above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "id": "HCb_9m_o8KEK"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "import cirq\n",
    "from google.auth.exceptions import DefaultCredentialsError\n",
    "from google.api_core.exceptions import PermissionDenied\n",
    "\n",
    "# Create an Engine object to use, providing the project id and the args\n",
    "try: \n",
    "    engine = cirq.google.get_engine()\n",
    "    engine.list_processors()\n",
    "    print(f\"Successful authentication using project {project_id}!\")\n",
    "except DefaultCredentialsError as err: \n",
    "    print(\"Could not authenticate to Google Quantum Computing Service.\")\n",
    "    print(\" Tips: If you are using Colab: make sure the previous cell was executed successfully.\")\n",
    "    print(\"       If this notebook is not in Colab (e.g. Jupyter notebook), make sure gcloud is installed and `gcloud auth application-default login` was executed.\")\n",
    "    print()\n",
    "    print(\"Error message:\")\n",
    "    print(err)\n",
    "except PermissionDenied as err:\n",
    "    print(f\"While you are authenticated to Google Cloud it seems the project '{project_id}' does not exist or does not have the Quantum Engine API enabled.\")\n",
    "    print(\"Error message:\")\n",
    "    print(err)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "XEG4t_2b8dYx"
   },
   "source": [
    "## Example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "id": "xujtwGxt8fOA"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Success!  Results:\n",
      "0000001111010100111111000100000000011100001000000011110011101011101101100000101000000110010110011100001001000110001110100101010010101100011010110000010001011001111001111001110011111001100011110110001001101010000000000111101101010110101010011011011111110010111010000010001000101110101100111111111101110100100100000011110010010000110111100111010010101111010001111100011100100101010011111011100000000100100001001100110001000101000011010101010111110001000000011100100000001011011111111001001011000001100110101000000001100110000111000100110101110111101010100110001101001000010110011001011010000111111000111010101111100101100001011101100101000110001100001100010001001001110010000010001011111101101101111011101101100010110001000111001010101001011111011111100011001110001110010111000011010011101101000011100111011000001001010101010010001101011010101011001001010001000111100101000011000101011011110111011101001011001001011011001101111010010011110010011101011011010111001110110101010101010101010001100101000001000101101001010000101110101011011111101010001011111010111110011101111111010100000001100000001100100011001011110111011111110011101010111000011101100111111101100001111100001110100100001010011001110111010000011101110011010001111011110101010011010111011001000101111010000110000111010111110001101011010010100010111111100001011111000001010000001001101100110011001100001000101101001100101011101100011011000111100111000001001100001110100010110011101001111101011000100111010001111001111000110000101001000100010110110001011111001100110101110001110110101101010001010101110100100110100000101101000101010011000110101010101011110111011111110010111011111100000001000000011110101010100111110000010001000101000111011001100100011001101101010000101010001100000001010001110110000000000111100110000010101100001000101110101100010110000010101000110110100010110101001001010010001010111010001001100000000011101110110010111100000000010011001010010010111111010100001011010100101001001110101100000001011001100011100111110011001101111000001001101111100111010100111111101000011100100110111010100010010000001101111111100101111101000101101010000010010100000100111000000110101111101000101001010010001111101000000001011011000111110001111100111010000110000100000110010101110011010100110010010111111010101100101101001111001001000000000100011111000101101001011010110010100100000011001111100111101111111011010110010000111001000110000011001111111010010010100110000011100101011001000111011010101000001011100010001011001111001101000111011000110110001001110010000010111010110100100110000010011101001000100010010011100000010010110100100011011010111000110110110000001001011000000000100111000101110010110001111001001111001011011110010110010101010001100010101000100000110111010111001111000111000010000100101011001001100111100011111000001010110011110111000101000010000110011010110110101110100000101011011001011001110011001001101010001000000111110000101100001100101000110000011110001110000101001001100010101010000000100101100001101001111001001101000010100001011110011100000100000000100010101100111101100011101101010100010110000101010011011101011010100110111100110011001011001000110100001000100010111011011110111011011110100010010011100001011001111001010111000000010110110100001010111010000111110101000000110101100110001010001101110101001110100110110110011111100111101111111001010011011001101111000000110110111110111000010001011001011011010110000000010010100101000110110000100011011010011110100010101101101001001001100001100001011000110011011011110100100000010001011011111000010110010111010011110011110010000101111011100010010011101011110000101010010000011001110101111000001011110010111110001110110100101001001100000011001010010100011101001100110111000001011111011010000111100010111100000011000110001111010100000111000101100000011100100101111100101111100111011110100110011100011110100111010000010111000110100011001000010011100101111010010100110100100011101100111001100101111111110101101001010111100000110010000111100010100100110001010000010011101110111010110010100000110001111100001001000100001010001010110101110110110111100101110001110010010001010110000001000101010111110001100011111011100010110111011000000010101110111101100110000010000000010100111110011000010000001010101111010100000110001001011000010101111100001111110001101100011110110010010110011110110010001011100010010000000010000101010010111101001010101011001011110100000101111100111010010110010001110001010101000111001101110011100000010101101011000100010110011011011111100010110111110100111111101100001100000000000101000101011100111000000100110000010110110010001111000011000101110000010101110011011000010111110111110101101000000100000110101010001000100100000010000101010000011010001000001111001001010011101101001001100100101011111011010100101010001011110111110011101100001010111111110110111010000011111100001101101000010111010000110001111000101110010110110101110000100000111101001101100111100000110100011101101111011111010010001110010011011110101101100100001001000110100110110001010111011101101100101101000111001000110111101000000001011000100110100010011001000111110010101110010010011011011011001111110010000111011011101010001011011000011010111011100001011000111100101000011010101010010001000010000100001000101100111111111110000111110010011001000110110111010000000110110100100111101101011001111110011010100000111000100100110110000000001110110010000010100010100101001000001101101100101001111101000111100001111110011110001000110000011011100100110100000010111011011000000011000000001011101010110100111101001101100100001111000011101110011001111111011101011000100010011001101010100110000001100111000001011001010110100111001101111101101000100111110001111100001110010110000000100101011010111001001100011101110111011100111011111111111111010010101100111111100101011101101011011010111110011011110111011111100110101010000000000101111000010100100100000100001110011010011001001110111111110001101010001010000010110111111111011010000110101001010111111110110111000111011000101100001000011010111010010000111110110100110010111000011011100000110011000110100011111100110000101101111101001100101001010101001011111100010110110000100110111110010111100011010110000011001100111010010000111111011000010110100111111101000101101100110000001010011000011111101010000000010011101101101111000101100010100001100011011100001101111101011101010110001110000101011011100010100110011001100110001100001101001000000010101100001000000110101110111000110100100101000001110110111001000001101100011011000010101110011100001111000011101011001011010100001101101011111001000101001011101000010111011000101011101110110100011110111101110110011101111010111010111001001101110001011000100011101000111000001000000100100000101000100001001010101110111010010011000100000010000111101011000010100100111001111101111011001110101000000100001111111000111100100011101111111000001111111101100000110010001110110001111010100010000000010000010101010010101000001001000000011001101100001110111010001000101011001010000000100111101001111010010001011011101011011011101110100000110110001100001010010111000111010010011110010001001010001001000011110000001000001111001101001111011011100010110010010101000001011000000100000101000111110010001000100000000110111100001011100010011100001011100110100001000010101101010100001000000100100010101001000101110110111010111111000110000100010000011110100100111010100000011111101010110100110110100001000001001001010101011010101011110011111000011000000111101110100000100101111100111110110000100110100000011111110111110100001011010111010000100101010101110001100100101000101101101001011101010101100111001001101001000110101111111001111011110101011101001110100000010010001101101100000010110000011001100001110110010100000000011110111100000100001101011001100110110000001001000001101111001101101111001110011101101101010001101100110111110011110010001000110110010100100010100111000000100010111011100100110100100110111000110001010010000110000001101000010100011101110010110101100001101001101000000100100010000010000011110110101100000011110010101010010001100110101001100101000101100010101001010000111000111000000000001001100100110001111000110100001000000010001110011011001110000011001000011101010011110000101001101111100110000111110101111111111101011100101011001001010101101001100110110111000111110111011101000011001100101010111101100111010001001000001011001101101111110001001111111111110001000100011100101100110110101101100110110010110011111001101001011011111110001011110110000100010000101011110011001000100010100011101111100010011011010011100111110111000111100110000010011100111011100011001011001101101011001000001001010011101111010000101011010100011010011001111011010001111010010111001111000001000001111100100010110001000100011011110001010011101000110000100110010111110111110011000101001000111000001100001110010000011100010001111100011001110011100001100011010010000001000001100010100100110101001101110011001001010100011010110011111010101100111110010011100101101111001110001011001000101101100111010000100111101010101010100001100011001101011111111110010001111100111001001110010101100111001010000001000100000111101110111001110111100100110101000110000001100000101001010001111000001110110100000011100011011100011011100101010100110011111110110011110100100111100110110100111010100001011101010001000010011010011101010001010101000100011111110001010000000100100111101110100000100100110100000101001111011011011110011111101001011100010111110110100011001100000101000110100101101011001010111100000000111010101011101110101100100101001001111010001111100101010011011000101000111100010010010000001111001001100011110001000110011010110110100100111011100111010110111010110011010101010111100110000101101111101110010001010011000010111001110110000100100101010001001010110110001001001011001000010100111100010110110101000111100110010110001010010010000110010101111000010001100111010100010111100110000000010001101001011100110001011000100101000011101000010110100001110011010101111011101111110110011111111000111010010010100010011100100100100011111111011111110100110001100110\n"
     ]
    }
   ],
   "source": [
    "# A simple example.\n",
    "q = cirq.GridQubit(5, 2)\n",
    "circuit = cirq.Circuit(cirq.X(q)**0.5, cirq.measure(q, key='m'))\n",
    "\n",
    "job = engine.run_sweep(\n",
    "    program=circuit,\n",
    "    repetitions=10000,\n",
    "    processor_ids=['rainbow'],\n",
    "    gate_set=cirq.google.SYC_GATESET)\n",
    "\n",
    "results = [str(int(b)) for b in job.results()[0].measurements['m'][:, 0]]\n",
    "print('Success!  Results:')\n",
    "print(''.join(results))"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [],
   "name": "colab.ipynb",
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "Python 3",
   "name": "python3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
